package br.com.alinesoftware.app.model.cliente;

import javax.inject.Inject;

import br.com.alinesoftware.app.domain.SituacaoCliente;
import br.com.alinesoftware.app.entity.Cliente;
import br.com.alinesoftware.app.entity.ClienteEntity;
import br.com.alinesoftware.app.entity.ClienteProprietario;
import br.com.alinesoftware.app.entity.Endereco;
import br.com.alinesoftware.app.entity.Proprietario;
import br.com.alinesoftware.app.entity.Telefone;

import com.powerlogic.jcompany.commons.annotation.PlcAggregationIoC;
import com.powerlogic.jcompany.commons.config.qualifiers.QPlcDefault;
import com.powerlogic.jcompany.commons.config.stereotypes.SPlcRepository;
import com.powerlogic.jcompany.model.PlcBaseRepository;
import com.powerlogic.jcompany.model.util.PlcIocModelUtil;
import com.powerlogic.jcompany.persistence.PlcBaseDAO;

/**
 * Classe de Modelo gerada pelo assistente
 */
 
@SPlcRepository 
@PlcAggregationIoC(classes={ClienteEntity.class})
public class ClienteBaseRepository extends PlcBaseRepository {

	@Inject @QPlcDefault 
	protected PlcIocModelUtil iocModeloUtil;
	
	@Override
	public Object insert(Object entidade) {
		
		Cliente cliente = (Cliente) entidade;
		persistirComponentes(cliente);
		cliente.setSituacaoCliente(SituacaoCliente.A);
		return super.insert(entidade);
	}
	
	@Override
	public Object update(Object entidade) {
		Cliente cliente = (Cliente) entidade;
		persistirComponentes(cliente);
		
		return super.update(entidade);
	}

	@Override
	public void delete(Object entidade) {
		Cliente cliente = (Cliente) entidade;
		removecComponentes(cliente);
		super.delete(entidade);
	}
	
	private void removecComponentes(Cliente cliente) {
		PlcBaseDAO pessoaDAO = iocModeloUtil.getPersistenceObject(Proprietario.class);
		PlcBaseDAO telefoneDAO = iocModeloUtil.getPersistenceObject(Telefone.class);
		
		for (ClienteProprietario clienteProprietario : cliente.getClienteProprietario()) {
			telefoneDAO.delete(clienteProprietario.getProprietario().getTelefone());
			pessoaDAO.delete(clienteProprietario.getProprietario());
		}
		
	}
	
	private void persistirComponentes(Cliente cliente) {
		PlcBaseDAO pessoaDAO = iocModeloUtil.getPersistenceObject(Proprietario.class);
		PlcBaseDAO telefoneDAO = iocModeloUtil.getPersistenceObject(Telefone.class);
		PlcBaseDAO enderecoDAO = iocModeloUtil.getPersistenceObject(Endereco.class);
		
		enderecoDAO.insert(cliente.getEndereco());
		telefoneDAO.insert(cliente.getTelefone());
		
		for (ClienteProprietario clienteProprietario : cliente.getClienteProprietario()) {
			if (clienteProprietario.getProprietario().getTelefone().getId() == null) {
				telefoneDAO.insert(clienteProprietario.getProprietario().getTelefone());				
			} else {
				telefoneDAO.update(clienteProprietario.getProprietario().getTelefone());				
			}
			if (clienteProprietario.getProprietario().getId() == null) {
				pessoaDAO.insert(clienteProprietario.getProprietario());
			} else {
				pessoaDAO.update(clienteProprietario.getProprietario());
			}
		}
	}
	
}
